package tablaSimbolos;

import java.util.HashMap;

import comun.Tipo;

public class TablaSimbolos {

	/*tabla interna*/
	private static HashMap<String,ContenidoTabla> tabla=new HashMap<String,ContenidoTabla>();
	
	/*objeto que hace de instancia para el patron singleton*/
	private static TablaSimbolos tablaSimbolos;
	
	public TablaSimbolos(){}
	
	/*aplico patr�n singleton*/
	public static TablaSimbolos creaTablaSimbolos()
	{
		if(tablaSimbolos==null)
			{
				/*creo tabla*/
				tablaSimbolos=new TablaSimbolos();
				
				/*introduzco las palabras reservadas en la tabla*/
				tablaSimbolos.anadirIdentificador("programa:",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("declaraciones:",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("instrucciones:",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("entero",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("natural",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("real",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("booleano",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("caracter",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("lee",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("escribe",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("variable",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("tipo",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("verdadero",Tipo.PAL_RES,-1);
				tablaSimbolos.anadirIdentificador("falso",Tipo.PAL_RES,-1);
			}
		return tablaSimbolos;
	}
	
	
	public boolean anadirIdentificador(String nombreVariable,Tipo tipo,int direccionMemoria)
	{
		if(estaIdentificador(nombreVariable))
		{
			return false;
		}
		else
		{
			tabla.put(nombreVariable, new ContenidoTabla(tipo,new Integer(direccionMemoria)));
			return true;
		}
	}
	
	public boolean estaIdentificador(String identificador)
	{
		return tabla.containsKey(identificador);
	}
	
	public Tipo dameTipoIdentificador(String identificador)
	{
		return tabla.get(identificador).getTipoIdentificador();
	}
	
	public int dameDireccionIdentificador(String identificador)
	{
		return tabla.get(identificador).getDireccionMemoria();
	}
	
	public boolean esPalabraReservada(String palabra)
	{
		if(tablaSimbolos.estaIdentificador(palabra)&&tablaSimbolos.dameTipoIdentificador(palabra)==Tipo.PAL_RES)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
